package d2_reflect;

import org.junit.Test;

import java.lang.reflect.Field;

/**
 * 目标: 掌握获取类的成员变量, 并对其进行操作
 */
public class Test3Field {

    @Test
    public void testGetFields() throws Exception {
        //1、反射第一步: 必须是先得到类的Class对象
        Class d = Dog.class;

        //java的变量就两种: 成员变量(实例变量(就是没有static修饰,属于对象持有),静态变量(是有static修饰属于类持有,常量(这个比较特殊-->static final修饰)))和实例变量
        //2、获取类的全部成员变量 -->可以拿全部的实例变量和类变量
        Field[] fields = d.getDeclaredFields();

        //3、遍历这个成员变量数组
        for (Field field : fields) {
            System.out.println(field.getName() + "-->" + field.getType());
        }

        //4、定位某个成员变量
        Field fName = d.getDeclaredField("name");
        System.out.println(fName.getName() + "--->" + fName.getType());

        Field NAME = d.getDeclaredField("NAME");
        System.out.println(NAME.getName() + "--->" + NAME.getType());


        //赋值
        Dog dog = new Dog();
        //虽然麻烦,但是就是这样写的---->反射,反过来嘛
        //让虚拟机忽略访问权限
        fName.setAccessible(true);
        fName.set(dog, "陈平安");
        //
        System.out.println(dog);


        //取值
        String name = (String) fName.get(dog);//更具对象去值
        System.out.println(name);
    }
    //那所有的成员变量-->私有的也会直接拿


    //为某一个成员变量赋值,成员变量是不可以独立存在的,它是属于对象的
    //所以要先声明一个对象
}
